#ifndef PORT_MANAGER_H
#define PORT_MANAGER_H

#include <stdio.h>
#include <string.h>
#include "iot_gpio.h"
#include "iot_dido.h"
#include "iot_uart.h"
#include "iot_errno.h"

#define BUNDLE_NAME_SIZE 64
#define SN_SIZE 65
#define NETWORK_ID_SIZE 65
#define DATA_SIZE 512

// 端口类型枚举
typedef enum {
    READ = 0, // 读
    WRITE = 1, // 写
    SUBSCRIBE = 2, // 订阅    //订阅设备 
    REGISTER_PORT2L2 = 3, // L0向L2注册设备的虚拟端口
    RELEASE_AND_UNREGISTER = 4, // 释放机电设备连接资源, 取消订阅
    UPDATE_NODES_INFO = 5, // 物模型向池化下发节点信息，方案修改，废弃
} PortType;

// 端口信息结构体
#pragma pack(1)
typedef struct
{
    char bundleName[BUNDLE_NAME_SIZE];
    char SN[SN_SIZE];
    char networkId[NETWORK_ID_SIZE];
    int32_t portNum;//保留字段，暂时不用，后面可能会用到
    int32_t type;
    int32_t port;
    int32_t portOffset;
    char data[DATA_SIZE];
} SendPortMsgInfo;
#pragma pack()

// 请求数据结构体
typedef struct {
    int protocolType;
    char msgId[256];
    char command[1024];
    int duration;
} PortRequest;

// 响应数据结构体
typedef struct {
    int type;
    int protocolType;
    char data[1024];
    char msgId[256];
    int code;
} PortResponse;

// 端口管理函数声明
void InitPorts(void);                                    //注册
void MonitorPorts(void);                                 //监控      
void ReportPortChange(const char *onlineNetworkId, int port, int newState);           //端口状态变更
void ControlPort(const SendPortMsgInfo *portInfo);       //控制端口
void UartControlPort(const SendPortMsgInfo *portInfo);   //uart控制
void SendPortResponse(const SendPortMsgInfo *portInfo);  //发送响应
int SendPortMsg(const SendPortMsgInfo *msgInfo);    //发送信息
int SendRegistrationToL2(const char *onlineNetworkId);    //主动发送注册信息给L2
void SetDOSignal(int port, int value); // 设置DO口开关信号
void SetDOPulse(int port, int value, unsigned int duration); // 设置DO口脉冲信号
// PortRequest ParsePortRequest(const char *jsonData);
// PortResponse ParsePortResponse(const char *jsonData);

#endif // PORT_MANAGER_H